package com.stdspringboot.ctrl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.stdspringboot.entity.User;
import com.stdspringboot.service.ILoginService;
import com.stdspringboot.service.impl.LoginSrvImpl;
import com.stdspringboot.util.Constant;
import com.stdspringboot.util.JWT;
import com.stdspringboot.vo.JsonResult;
import com.stdspringboot.vo.LoginVO;
import com.stdspringboot.vo.UserInfoJWT;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//声明该类是 Controller 层，并且由 springboot 统一管理该类对象的创建、销毁
@Controller
public class LoginCtrl {
    //根据类型匹配，在 spring 容器中，找到该类型的对象，并注入
    @Resource(name="LoginSrvImpl")
    private ILoginService loginSrvImpl;

    //当类中没有构造方法时，那么java会默认添加一个 无参构造方法（默认构造方法）
    //相当于空气、细菌，看不见，但确认存在
    public LoginCtrl() {
        //证明 springboot 通过 该无参构造方法创建的对象
        System.out.println("LoginCtrl的无参构造方法");
    }

    @RequestMapping("/login")
    @ResponseBody // 将返回的java对象转换成 json格式的字符串
    public JsonResult login(@RequestBody LoginVO vo){


        JsonResult jr=null;
        String username=vo.getUsername();
        String password=vo.getPassword();
        //非空校验
        if(username==null || "".equals(username)){
            jr=new JsonResult(JsonResult.CODE_VALIDATE_FAIL,"用户名不能为空！");
            return jr;
        }
        if(password==null || "".equals(password)){
            jr=new JsonResult(JsonResult.CODE_VALIDATE_FAIL,"密码不能为空！");
            return jr;
        }

        try {
            jr=loginSrvImpl.login(username,password);
            User user=(User)jr.getData();

            if(user==null){
                jr=JsonResult.fail(JsonResult.CODE_LOGIN_FAIL,"用户名或密码错误，请重新登录！");
                return jr;
            }
            //将用户信息封装 UserInfoJWT中
            UserInfoJWT uij=new UserInfoJWT();
            uij.setId(user.getUid());
            uij.setUsername(user.getUsername());
            uij.setName(user.getRealName());

            //将 UserInfoJWT 对象转换成 字符串，因为 jwt.createToken() 只能传入字符串
            ObjectMapper om=new ObjectMapper();
            String uiJSON= null;
            try {
                uiJSON = om.writeValueAsString(uij);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            System.out.println(uiJSON);

            //生成 token
            JWT jwt=new JWT();
            String token=jwt.createToken(uiJSON);

            System.out.println(token);

            //将用户信息、token返回给前端
            jr=new JsonResult(0,"登录成功");
            Map tokenMap=new HashMap();
            tokenMap.put("token",token);
            jr.setData(tokenMap);


        } catch (Exception e) {
            e.printStackTrace();
            jr=new JsonResult(JsonResult.CODE_SERVER_ERROR,"服务器发生错误，请联系管理员！");
        }
        return jr;
    }
}
